iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

我只是想自動執行 Ansible ,一定要用 Jenkins 嗎系列 第 13

Ansible 部署後端 API 的 docker container

  • 分享至 

  • xImage
  •  

前情提要

  1. adhoc 寫一個 Python FastAPI 範例 + Dockerfile
  2. 用 Ansible 遠端部署 <- 現在在這裡
  3. 用 Ansible AWX 自動部署

還記得我們之前的 day 10 的文章 手動部署 Python FastAPI demo app in Docker 嗎?
我們今天要寫一支最簡單的 playbook 來進行遠端部署,
先看一下目錄結構

.
├── ansible.cfg
├── inventory
├── main.yml
└── roles
    ├── build_fastapi
    │   └── tasks
    │       └── main.yml
    └── hello_world
        ├── tasks
        │   └── main.yml
        └── vars
            └── main.yml

很顯然我們今天新增 roles/build_fastapi/tasks/main.yml
它做什麼事?還記得我們 day2 的文章Simple Build Flow 的系統架構嗎?

軟體自動化的底層邏輯其實就是五拍子

  1. incoming request: 某個人通知你要做某件事
  2. pull resources: 到處拉 repo 拉 config
  3. build artifacts: 把 code 編成各種 binary,把參數結合各種模板揉成各種 config
  4. push results: 把各種 output 推到該去的地方,不管是 code、config、binary...etc
  5. notify status: 不管結果如何,由機器通知到負責管理的人

然後我們又提到,
第一步是 Ansible AWX 要做的,
今天要做第二至四步,
至於第五步,我們先在 console 上 parse 出執行結果,
結果的本身其實有很多種方法通知以後再細說

真的進行 playbook 的編寫之前,
我們先改一個檔案,最外層的 mail.yml

---
- name: main task
  hosts: staging
  vars:
    build_root_abspath: "/home/ubuntu/build/{{ ansible_date_time.iso8601_basic_short }}"
    demobackend_version: "latest"
  roles:
    - role: build_fastapi

這邊新增了兩個全域的參數

  • build_root_abspath: 代表每次執行 build flow/CI jobs 的時候,在遠端機器的暫存目錄
  • demobackend_version: 代表我們 backend api 這次要部署的版本

等等我們會在 roles/build_fastapi 來使用,
之所以開成全域參數,
是因為今天為了 demo 方便,
把拉 code、編 code、部署…etc 通通寫在同一支 playbook,
正常來說應該要切開,
原因是有些工作可能可以平行做,像是編好幾個 docker,
這時候最好拆成不同 playbook 來執行,
而不會像 demo 這樣全部寫在一起

接著就是今天的 playbook: roles/build_fastapi/tasks/main.yml

---
- name: show remote host
  debug:
    msg: "the remote server is {{ ansible_host }}"
- name: create build dir if not exists
  file:
    path: "{{ build_root_abspath }}"
    state: directory
- name: git clone
  git:
    repo: "git@github.com:yiidtw/ironman2023-demo-fastapi.git"
    dest: "{{ build_root_abspath }}"
    remote: "origin"
    version: "main"
- name: build docker
  community.docker.docker_image:
    name: ironman2023-fastapi
    build:
      path: "{{ build_root_abspath }}"
    tag: "{{ demobackend_version }}"
    source: build
- name: run docker
  docker_container:
    name: demobackend
    state: started
    recreate: yes
    image: "ironman2023-fastapi:{{ demobackend_version }}"
    ports:
      - "8080:8080"
- name: wait for the api ready
  wait_for:
    host: 0.0.0.0
    port: 8080
    delay: 10
- name: testing api locally
  shell: "curl -k localhost:8080"
  register: reg_curl_result
- name: show curl result
  debug:
    msg: "{{ reg_curl_result.stdout }}"

我們先來看一下執行結果,
明天再來解釋
img


上一篇
Ansible playbook hello world
下一篇
Ansible 部署後端 API 的 docker container 續
系列文
我只是想自動執行 Ansible ,一定要用 Jenkins 嗎30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言